package com.tian.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tian.mapper.ItemCatMapper;
import com.tian.pojo.ItemCat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ItemCatServiceImpl implements ItemCatService{
    @Autowired
    private ItemCatMapper itemCatMapper;

    /**
     * type:  1级2级3级
     * 问题分析：
     *      1.提高程序的效率 减少数据库交互的次数
     *      2.查询的方法最好单独抽取
     * 数据结构：MapM<K,V>
     */
    //1.封装一个Map集合
    public Map<Integer,List<ItemCat>> getMap(){
        Map<Integer,List<ItemCat>> map= new HashMap<Integer,List<ItemCat>>();
        //1.查询所有数据的信息
        List<ItemCat> list= itemCatMapper.selectList(null);
        //2.将list集合封装到Map集合中
        for (ItemCat itemCat : list) {
            // 么有key：该子集是第一个父级元素的子集 应该声明父级并且将子集作为第一个存入序列
            // 有key： 找到父级的子集序列 将子集追加到序列中即可
            //3.规则： 判断map是否有key
            if(map.containsKey(itemCat.getParentId())){
                //有父级   获取父级所有已知子级
//                List<ItemCat> catList=map.get(itemCat.getParentId());
//                catList.add(itemCat);  //简化
                map.get(itemCat.getParentId()).add(itemCat);
            }else{
                //没有父级
                List<ItemCat> ItemCatlist = new ArrayList<>();
                ItemCatlist.add(itemCat);
                map.put(itemCat.getParentId(),ItemCatlist);
            }
        }
        return map;
    }


    @Override
    public List<ItemCat> findItemCatList(Integer type) {
        Map<Integer,List<ItemCat>> map=getMap();
        if(type == 1){
            return map.get(0);
        }

        if(type == 2){
            return getLevel2(map);
        }

        return getLevel3(map);

    }

    @Override
    @Transactional//事务
    public void updatestatus(ItemCat itemCat) {
        System.out.println(itemCat);
        itemCatMapper.updateById(itemCat);
    }

    @Override
    public void saveItemCat(ItemCat itemCat) {
        itemCat.setStatus(true);
        itemCatMapper.insert(itemCat);

    }


    @Override
    public void deleteItemCat(Integer id,Integer level) {
        if (level == 3){
            //如果是3级商品直接删除
            itemCatMapper.deleteById(id);
        }
        if(level == 2){
            //需要删除的是2级菜单  关联删除3级菜单
            //先删除3级菜单
            QueryWrapper<ItemCat> queryWrapper= new QueryWrapper<>();
            queryWrapper.eq("parent_id", id);
            itemCatMapper.delete(queryWrapper);
            //再删除2级
            itemCatMapper.deleteById(id);
        }
        if (level == 1){
            //获取1级主键信息
            QueryWrapper<ItemCat> queryWrapper= new QueryWrapper<>();
            List twoIDList = itemCatMapper.selectObjs(queryWrapper);
            //2.先删除3级
            for (Object twoId : twoIDList) {
                QueryWrapper<ItemCat> queryWrapper2= new QueryWrapper<>();
                queryWrapper2.eq("parent_id", id);
                //selectObjs 获取主键信息（第一列信息）
                itemCatMapper.delete(queryWrapper2);
                //再删除2级
                Integer intTwoId = (Integer)  twoId;
                itemCatMapper.deleteById(intTwoId);
            }
            //最后删除1级
            itemCatMapper.deleteById(id);
        }
    }

    private List<ItemCat> getLevel3(Map<Integer, List<ItemCat>> map) {
        //1.获取二级商品分类信息  1级里边套2级
        List<ItemCat> list = getLevel2(map);
        for (ItemCat itemCat1 : list) {

            List<ItemCat> list2 = itemCat1.getChildren();
            if (list2 == null)
                continue;//停一次 本次循环结束 直接下一次
            //根据2级查询3级信息
            for (ItemCat itemCat2 : list2) {
                List<ItemCat> list3 = map.get(itemCat2.getId());
                itemCat2.setChildren(list3);
            }
            //将3级已经封装完成  将2级封装到一级中
            itemCat1.setChildren(list2);
        }

        return list;
    }



    private List<ItemCat> getLevel2(Map<Integer,List<ItemCat>> map) {
        //1.获取1级商品分类信息
        List<ItemCat> list =map.get(0);
        //2.封装2级菜单信息
        for (ItemCat itemCat : list) {
            //如何获取该一级的子集--> 2级集合信息
            List<ItemCat> TwoList = map.get(itemCat.getId());
            itemCat.setChildren(TwoList);
        }
        return list;
    }

}


